home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -screenplay- / shareware / warpquake / warpquakesrc / bspfile.h < prev    next >
C/C++ Source or Header  |  2000-02-29  |  7KB  |  325 lines

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20.  
  21.  
  22. // upper design bounds
  23.  
  24. #define    MAX_MAP_HULLS        4
  25.  
  26. #define    MAX_MAP_MODELS        256
  27. #define    MAX_MAP_BRUSHES        4096
  28. #define    MAX_MAP_ENTITIES    1024
  29. #define    MAX_MAP_ENTSTRING    65536
  30.  
  31. #define    MAX_MAP_PLANES        32767
  32. #define    MAX_MAP_NODES        32767        // because negative shorts are contents
  33. #define    MAX_MAP_CLIPNODES    32767        //
  34. #define    MAX_MAP_LEAFS        8192
  35. #define    MAX_MAP_VERTS        65535
  36. #define    MAX_MAP_FACES        65535
  37. #define    MAX_MAP_MARKSURFACES 65535
  38. #define    MAX_MAP_TEXINFO        4096
  39. #define    MAX_MAP_EDGES        256000
  40. #define    MAX_MAP_SURFEDGES    512000
  41. #define    MAX_MAP_TEXTURES    512
  42. #define    MAX_MAP_MIPTEX        0x200000
  43. #define    MAX_MAP_LIGHTING    0x100000
  44. #define    MAX_MAP_VISIBILITY    0x100000
  45.  
  46. #define    MAX_MAP_PORTALS        65536
  47.  
  48. // key / value pair sizes
  49.  
  50. #define    MAX_KEY        32
  51. #define    MAX_VALUE    1024
  52.  
  53. //=============================================================================
  54.  
  55.  
  56. #define BSPVERSION    29
  57. #define    TOOLVERSION    2
  58.  
  59. typedef struct
  60. {
  61.     int        fileofs, filelen;
  62. } lump_t;
  63.  
  64. #define    LUMP_ENTITIES    0
  65. #define    LUMP_PLANES        1
  66. #define    LUMP_TEXTURES    2
  67. #define    LUMP_VERTEXES    3
  68. #define    LUMP_VISIBILITY    4
  69. #define    LUMP_NODES        5
  70. #define    LUMP_TEXINFO    6
  71. #define    LUMP_FACES        7
  72. #define    LUMP_LIGHTING    8
  73. #define    LUMP_CLIPNODES    9
  74. #define    LUMP_LEAFS        10
  75. #define    LUMP_MARKSURFACES 11
  76. #define    LUMP_EDGES        12
  77. #define    LUMP_SURFEDGES    13
  78. #define    LUMP_MODELS        14
  79.  
  80. #define    HEADER_LUMPS    15
  81.  
  82. typedef struct
  83. {
  84.     float        mins[3], maxs[3];
  85.     float        origin[3];
  86.     int            headnode[MAX_MAP_HULLS];
  87.     int            visleafs;        // not including the solid leaf 0
  88.     int            firstface, numfaces;
  89. } dmodel_t;
  90.  
  91. typedef struct
  92. {
  93.     int            version;    
  94.     lump_t        lumps[HEADER_LUMPS];
  95. } dheader_t;
  96.  
  97. typedef struct
  98. {
  99.     int            nummiptex;
  100.     int            dataofs[4];        // [nummiptex]
  101. } dmiptexlump_t;
  102.  
  103. #define    MIPLEVELS    4
  104. typedef struct miptex_s
  105. {
  106.     char        name[16];
  107.     unsigned    width, height;
  108.     unsigned    offsets[MIPLEVELS];        // four mip maps stored
  109. } miptex_t;
  110.  
  111.  
  112. typedef struct
  113. {
  114.     float    point[3];
  115. } dvertex_t;
  116.  
  117.  
  118. // 0-2 are axial planes
  119. #define    PLANE_X            0
  120. #define    PLANE_Y            1
  121. #define    PLANE_Z            2
  122.  
  123. // 3-5 are non-axial planes snapped to the nearest
  124. #define    PLANE_ANYX        3
  125. #define    PLANE_ANYY        4
  126. #define    PLANE_ANYZ        5
  127.  
  128. typedef struct
  129. {
  130.     float    normal[3];
  131.     float    dist;
  132.     int        type;        // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate
  133. } dplane_t;
  134.  
  135.  
  136.  
  137. #define    CONTENTS_EMPTY        -1
  138. #define    CONTENTS_SOLID        -2
  139. #define    CONTENTS_WATER        -3
  140. #define    CONTENTS_SLIME        -4
  141. #define    CONTENTS_LAVA        -5
  142. #define    CONTENTS_SKY        -6
  143. #define    CONTENTS_ORIGIN        -7        // removed at csg time
  144. #define    CONTENTS_CLIP        -8        // changed to contents_solid
  145.  
  146. #define    CONTENTS_CURRENT_0        -9
  147. #define    CONTENTS_CURRENT_90        -10
  148. #define    CONTENTS_CURRENT_180    -11
  149. #define    CONTENTS_CURRENT_270    -12
  150. #define    CONTENTS_CURRENT_UP        -13
  151. #define    CONTENTS_CURRENT_DOWN    -14
  152.  
  153.  
  154. // !!! if this is changed, it must be changed in asm_i386.h too !!!
  155. typedef struct
  156. {
  157.     int            planenum;
  158.     short        children[2];    // negative numbers are -(leafs+1), not nodes
  159.     short        mins[3];        // for sphere culling
  160.     short        maxs[3];
  161.     unsigned short    firstface;
  162.     unsigned short    numfaces;    // counting both sides
  163. } dnode_t;
  164.  
  165. typedef struct
  166. {
  167.     int            planenum;
  168.     short        children[2];    // negative numbers are contents
  169. } dclipnode_t;
  170.  
  171.  
  172. typedef struct texinfo_s
  173. {
  174.     float        vecs[2][4];        // [s/t][xyz offset]
  175.     int            miptex;
  176.     int            flags;
  177. } texinfo_t;
  178. #define    TEX_SPECIAL        1        // sky or slime, no lightmap or 256 subdivision
  179.  
  180. // note that edge 0 is never used, because negative edge nums are used for
  181. // counterclockwise use of the edge in a face
  182. typedef struct
  183. {
  184.     unsigned short    v[2];        // vertex numbers
  185. } dedge_t;
  186.  
  187. #define    MAXLIGHTMAPS    4
  188. typedef struct
  189. {
  190.     short        planenum;
  191.     short        side;
  192.  
  193.     int            firstedge;        // we must support > 64k edges
  194.     short        numedges;    
  195.     short        texinfo;
  196.  
  197. // lighting info
  198.     byte        styles[MAXLIGHTMAPS];
  199.     int            lightofs;        // start of [numstyles*surfsize] samples
  200. } dface_t;
  201.  
  202.  
  203.  
  204. #define    AMBIENT_WATER    0
  205. #define    AMBIENT_SKY        1
  206. #define    AMBIENT_SLIME    2
  207. #define    AMBIENT_LAVA    3
  208.  
  209. #define    NUM_AMBIENTS            4        // automatic ambient sounds
  210.  
  211. // leaf 0 is the generic CONTENTS_SOLID leaf, used for all solid areas
  212. // all other leafs need visibility info
  213. typedef struct
  214. {
  215.     int            contents;
  216.     int            visofs;                // -1 = no visibility info
  217.  
  218.     short        mins[3];            // for frustum culling
  219.     short        maxs[3];
  220.  
  221.     unsigned short        firstmarksurface;
  222.     unsigned short        nummarksurfaces;
  223.  
  224.     byte        ambient_level[NUM_AMBIENTS];
  225. } dleaf_t;
  226.  
  227.  
  228. //============================================================================
  229.  
  230. #ifndef QUAKE_GAME
  231.  
  232. #define    ANGLE_UP    -1
  233. #define    ANGLE_DOWN    -2
  234.  
  235.  
  236. // the utilities get to be lazy and just use large static arrays
  237.  
  238. extern    int            nummodels;
  239. extern    dmodel_t    dmodels[MAX_MAP_MODELS];
  240.  
  241. extern    int            visdatasize;
  242. extern    byte        dvisdata[MAX_MAP_VISIBILITY];
  243.  
  244. extern    int            lightdatasize;
  245. extern    byte        dlightdata[MAX_MAP_LIGHTING];
  246.  
  247. extern    int            texdatasize;
  248. extern    byte        dtexdata[MAX_MAP_MIPTEX]; // (dmiptexlump_t)
  249.  
  250. extern    int            entdatasize;
  251. extern    char        dentdata[MAX_MAP_ENTSTRING];
  252.  
  253. extern    int            numleafs;
  254. extern    dleaf_t        dleafs[MAX_MAP_LEAFS];
  255.  
  256. extern    int            numplanes;
  257. extern    dplane_t    dplanes[MAX_MAP_PLANES];
  258.  
  259. extern    int            numvertexes;
  260. extern    dvertex_t    dvertexes[MAX_MAP_VERTS];
  261.  
  262. extern    int            numnodes;
  263. extern    dnode_t        dnodes[MAX_MAP_NODES];
  264.  
  265. extern    int            numtexinfo;
  266. extern    texinfo_t    texinfo[MAX_MAP_TEXINFO];
  267.  
  268. extern    int            numfaces;
  269. extern    dface_t        dfaces[MAX_MAP_FACES];
  270.  
  271. extern    int            numclipnodes;
  272. extern    dclipnode_t    dclipnodes[MAX_MAP_CLIPNODES];
  273.  
  274. extern    int            numedges;
  275. extern    dedge_t        dedges[MAX_MAP_EDGES];
  276.  
  277. extern    int            nummarksurfaces;
  278. extern    unsigned short    dmarksurfaces[MAX_MAP_MARKSURFACES];
  279.  
  280. extern    int            numsurfedges;
  281. extern    int            dsurfedges[MAX_MAP_SURFEDGES];
  282.  
  283.  
  284. void DecompressVis (byte *in, byte *decompressed);
  285. int CompressVis (byte *vis, byte *dest);
  286.  
  287. void    LoadBSPFile (char *filename);
  288. void    WriteBSPFile (char *filename);
  289. void    PrintBSPFileSizes (void);
  290.  
  291. //===============
  292.  
  293.  
  294. typedef struct epair_s
  295. {
  296.     struct epair_s    *next;
  297.     char    *key;
  298.     char    *value;
  299. } epair_t;
  300.  
  301. typedef struct
  302. {
  303.     vec3_t        origin;
  304.     int            firstbrush;
  305.     int            numbrushes;
  306.     epair_t        *epairs;
  307. } entity_t;
  308.  
  309. extern    int            num_entities;
  310. extern    entity_t    entities[MAX_MAP_ENTITIES];
  311.  
  312. void    ParseEntities (void);
  313. void    UnparseEntities (void);
  314.  
  315. void     SetKeyValue (entity_t *ent, char *key, char *value);
  316. char     *ValueForKey (entity_t *ent, char *key);
  317. // will return "" if not present
  318.  
  319. vec_t    FloatForKey (entity_t *ent, char *key);
  320. void     GetVectorForKey (entity_t *ent, char *key, vec3_t vec);
  321.  
  322. epair_t *ParseEpair (void);
  323.  
  324. #endif
  325.